// pages/cart/cart.js
/* 
  1.获取用户收货地址
    1.绑定事件
    2.调用小程序内置api
    3.获取 用户对小程序所授权 获取地址的 权限状态 scope
      1.假设点击确定授权 scope为true
      2.没有使用过的话 scope为undefined
      3.假设点击取消授权 scope为false
        1.让用户自己打开权限授权页面
    4.获取收货地址
    5.将获取到的收货地址 存入到 本地存储中
  2.页面加载完毕,存储数据
    0 onLoad onShow
    1.获取本地存储中的数据
    2.把数据 设置给data的一个变量
*/
/* 
  1. 全选的实现 数据的展示
    1.onShow获取缓存中的购物车数组
    2.根据购物车中的商品数据 所有的商品都被选中
*/
/* 
  商品总价
    1.都需要商品被选中，才计算他
    2.获取购物车数据
    3.遍历
    4.判断是否被选中
*/
/* 商品的选中功能
  1.绑定change事件
  2.获取到被修改的商品对象
  3.商品对象的选中状态 取反
 */
/* 全选和反选功能
  1.获取data中的全选变量
  2.直接取反
  3.遍历购物车数组 isAllChecked 改变而改变
  4.把数组和isAllChecked 重新设置data中
*/
/* 商品数量的编辑
  1.+ - 绑定同一个点击事件    区分的关键在于自定义属性
    1.+ +1
    2.- -1
  2.传递被点击的商品id    goods_id
  3.获取data中的购物车数组 来获取需要被修改的商品对象
  4。直接修改商品对象数量 num
*/
/* 点击结算 
  1.判断下有没有收货地址信息
  2.判断用户有没有选购商品
  3.经过以上的验证就进行跳转支付页面
*/
// 异步处理同步化
import regeneratorRuntime from '../../lib/runtime/runtime.js';
import {getSetting,chooseAddress,openSetting,showModal,showToast} from '../../utils/asyncWx.js'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 收货信息
    address:{},
    // 加入购物车的商品信息
    cart:[],
    // 是否全部选中
    isAllChecked:false,
    // 总数量
    totalNum:0,
    // 总价格
    totalPrice:0
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },
  onShow(){
    // 1.获取缓存中的收货地址信息
    const address = wx.getStorageSync('address');
    // 1.获取缓存中的数据
    const cart = wx.getStorageSync("cart") || [];
    // 存储地址
    this.setData({address});
    // 设置购物车状态同时重新渲染数据
    this.setCart(cart);
  },
  // 获取收货地址
  async handleChooseAddress(e){
    try{
      // 1.获取权限状态
      const res1 = await getSetting();
      // 2.获取权限状态 只要发现一些属性名很怪异的时候都要用中括号获取
      const scopeAddress = res1.authSetting["scope.address"];
      // 3.判断是否授权
      if(scopeAddress===false){
        // 3.让他重新授权
        await openSetting();
      }
      // 4.获取收货地址
      const address = await chooseAddress();
      console.log(address);
      // 5.将address,数据存储到本地缓存中
      wx.setStorageSync("address", address)
    }catch(error){
      console.log();
    }
  },
  // 修改地址
  async handlEmodify(){
    const address1 = await chooseAddress();
    wx.setStorageSync("address", address1)
  },
  // 商品的选中
  handelItemChange(e){
    // 1.获取被修改的商品Id
    const goods_id = e.currentTarget.dataset.id;
    // 2.获取购物车数组
    let {cart} = this.data;
    // 3.找到被修改的商品对象
    let index = cart.findIndex(v =>v.goods_id === goods_id);
    // 4.选中状态取反
    cart[index].checked = !cart[index].checked;
    // 5.把购物车数据重新渲染
    this.setCart(cart);
  },
  // 设置购物车状态同时重新渲染数据
  setCart(cart){
    let isAllChecked = true;
    // 总价格 总数量
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(v => {
      if(v.checked){
        totalPrice += v.num*v.goods_price;
        totalNum += v.num;
      }else{
        isAllChecked=false;
      }
    });
    // 判断数组是否为空
    isAllChecked = cart.length?isAllChecked:false;
    // 2.把数据存储在address
    this.setData({cart,totalPrice,totalNum,isAllChecked});
    // 存到缓存
    wx.setStorageSync("cart",cart)
  },
  // 商品全选功能
  handelItemAllChange(e){
    // 1.获取data 中的数据
    let {cart, isAllChecked} = this.data;
    // 2.修改值
    isAllChecked = !isAllChecked;
    // 3.循环修改数组中的商品选中状态
    cart.forEach(v => v.checked=isAllChecked);
    // 4.修改后的值 填充会data中
    this.setCart(cart);
  },
  // 商品数量的编辑功能
  async handleItemNumEdit(e){
    // 1.获取传递过来的参数
    const {operation,id} = e.currentTarget.dataset;
    // 2.获取购物车数组
    let {cart} = this.data;
    // 3.需要修改的索引
    const index = cart.findIndex(v=>v.goods_id === id);
    // 4.判断是否要执行删除
    if(cart[index].num ==1&& operation===-1){
      // 弹窗提示
      const res =await showModal('你是否要删除？');
          if (res.confirm) {
            cart.splice(index,1);
            this.setCart(cart);
          }
    }else{
      // 4.进行修改数量
      cart[index].num += operation;
      // 5.渲染数据
      this.setCart(cart);
    }
  },
  // 点击结算，跳转支付界面
  async handlePay(){
    // 1.判断是否有收货地址，商品
    const {address,totalNum} = this.data;
    if(!address.userName){
      await showToast("您还没有选择收货地址");
      return;
    }
    // 2.判断用户有没有选购商品
    if(totalNum==0){
      await showToast("您还没有选购商品");
      return;
    }
    // 3.跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/pay'
    })

  }
});